(function () {
    /*
    * 以abstract开头的类为抽象类
    * 避免此类被用来创建对象
    * 抽象类中可以添加抽象方法
    * */
    abstract class Animal {
        name: string

        constructor(name: string) {
            this.name = name
        }

        // 抽象方法使用 abstract 没有方法体
        // 抽象方法只能定义在抽象类中，子类必须对抽象方法进行重写
        abstract sayHello(): void
    }

    class Dog extends Animal {

        sayHello() {
            // 在类的方法中super表示当前类的父类
            // super.sayHello();
            console.log('汪汪汪')
        }
    }

    class Cat extends Animal {
        sayHello() {
            console.log('喵喵喵')
        }
    }

    const dog = new Dog('旺财')
    dog.sayHello()
})()

